跳到主要内容

网络安全 加密

注意:这篇笔记主要记录一些概念性质的东西,将这整套流程理顺,至于细节看具体的各篇笔记

对称加密算法(AES、DES、3DES)

对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)。

AES 加密算法是密码学中的高级加密标准,采用的是对称分组密码体制,密钥长度的最少支持为128。AES加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的 DES,已经被多方分析且广为全世界使用。

优点:加密速度快

缺点:密钥的传递和保存是一个问题,参与加密和解密的双方使用的密钥是一样的,这样密钥就很容易泄露。

非对称加密算法(RSA、DSA、ECC)

非对称加密算法是指加密和解密采用不同的密钥(公钥和私钥),因此非对称加密也叫公钥加密,是可逆的(即可解密)。主要特点是通过公钥加密的内容只有私钥才可以解密,反之,通过私钥加密的内容,也只有公钥才可以解密,公钥密码体制根据其所依据的难题一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类。

RSA加密算法是基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解极其困难,因此可以将乘积公开作为加密密钥。虽然 RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击至今未被完全攻破。

优点:加密和解密的密钥不一致,公钥是可以公开的,只需保证私钥不被泄露即可,这样就密钥的传递变的简单很多,从而降低了被破解的几率。

缺点:加密速度慢

RSA 加密算法既可以用来做数据加密,也可以用来数字签名。

  • 数据加密过程:发送者用公钥加密,接收者用私钥解密(只有拥有私钥的接收者才能解读加密的内容)
  • 数字签名过程:甲方用私钥加密,乙方用公钥解密(乙方解密成功说明就是甲方加的密,甲方就不可以抵赖)

线性散列算法算法(MD5、SHA1、HMAC)

MD5 全称是 Message-Digest Algorithm 5(信息摘要算法5),单向的算法不可逆(被 MD5 加密的数据不能被解密)。MD5 加密后的数据长度要比加密数据小的多,长度固定,且加密后的串是唯一的。

适用场景:常用在不可还原的密码存储、信息完整性校验等。

信息完整性校验:典型的应用是对一段信息产生信息摘要,以防止被篡改。如果再有一个第三方的认证机构,用 MD5 还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

注意:MD5 并不是加密算法,其全称是 Message Digest Algorithm MD5,意为 信息摘要算法,是一种不可逆的哈希算法,也就是说经过前端 MD5 处理过的数据在服务器端是无法复原的。

混合加密

由于以上加密算法都有各自的缺点(RSA加密速度慢、AES密钥存储问题、MD5加密不可逆),因此实际应用时常将几种加密算法混合使用。

例如:RSA+AES:

采用 RSA 加密 AES 的密钥,采用 AES 对数据进行加密,这样集成了两种加密算法的优点,既保证了数据加密的速度,又实现了安全方便的密钥管理。

那么,采用多少位的密钥合适呢?一般来讲密钥长度越长,安全性越高,但是加密速度越慢。所以密钥长度也要合理的选择,一般 RSA 建议采用 1024 位的数字,AES 建议采用 128 位即可。

Base64 编码传输

Base64 并不能算是一种加密算法,而是一种编码格式,是网络上最常见的用于传输 8bid 字节代码的编码方式之一。

Base64 编码可用于在 HTTP 环境下传递较长的标识信息,Base 编码不仅不仅比较简单,同时也据有不可读性(编码的数据不会被肉眼直接看到)。

生成 RSA 密钥

打开 PowerShell 生成 RSA 公钥密钥

ssh-keygen -t rsa -b 2048   
# 上面一行的 -t 参数代表类型 type,表示用 rsa 方式加密;-b 参数,这里表示生成 2048 位的公钥
# 生成公钥-私钥对总共只用到这一个命令,以下是配置部分

Generating public/private rsa key pair.
Enter file in which to save the key
# 指定保存的位置(默认是 C:\Users\alsritter/.ssh/id_rsa 小心自己以前的密钥被覆盖了...)

Enter passphrase (empty for no passphrase):【在这里输入私钥密码】(我这里输入的是 123456)
Enter same passphrase again:【重复输入私钥密码】

然后就能在这个目录找到刚刚生成的公钥私钥了

什么叫给密码“加盐”?

我们通常会将用户的密码进行 Hash 加密,如果不加盐,即使是两层的 md5 都有可能通过彩虹表的方式进行破译。彩虹表就是在网上搜集的各种字符组合的 Hash 加密结果。而加盐,就是人为的通过一组随机字符与用户原密码的组合形成一个新的字符,从而增加破译的难度。就像做饭一样,加点盐味道会更好。

提示

相同的密码被哈希化,所得到的哈希值将会不同,如果共享相同密码的所有用户具有相同的哈希值,当一个用户的密码被“破解”或被猜出时,任何使用相同密码的人也都“泄露”密码。不加盐的 Hash 非常容易被记录彩虹表,要相信大部分人就是喜欢使用简单容易记住的密码比如 12345678。

也就是说最终的密文是以下两个内容的函数:

  • 用户输入的密码明文
  • 盐值

最后要将以下内容存入数据库:

  • 用户的用户名
  • 最终的密文
  • 加密所用的盐值

数字签名和数字证书

数字签名就相当于是 用自己的私钥对发布的内容进行加密后得到的密文(此处一般为了提高效率,一般会先对原文进行摘要加密,然后在对密文进行签名),然后再尝试用公钥去解密,如果成功则表示没有问题,否则就是伪造的(其实就是加密的逆过程)

数字证书是为了解决客户端的公钥有可能被篡改,从而伪造中间人的问题。通过第三方 CA 认证机构签发证书,从而保证证书中的发布者的公钥是正确的。 数字证书会包含以下内容:

  • 申请者的信息
  • 申请者的公钥(很重要的信息)
  • 使用证书发行方(CA机构)的私钥对整个证书信息进行加密后的签名(这个签名主要就是用来验证证书的内容是否被人篡改)
  • 其他信息,比如证书有效期,CA机构的公钥等等

下面就借用 阮一峰老师的图进行解释

1、

鲍勃有两把钥匙,一把是公钥,另一把是私钥。

2、

鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。

3、

苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。

4、

鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

5、

鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用 Hash 函数,生成信件的摘要(digest)。

6、

然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。

7、

鲍勃将这个签名,附在信件下面,一起发给苏珊。

8、

苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

9、

苏珊再对信件本身使用 Hash 函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

10、

复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。(中间人攻击)

11、

后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找 "证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成 "数字证书"(Digital Certificate)。

12、

鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

13、

苏珊收信后,用 CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明 "数字签名" 是否真的是鲍勃签的。

HTTPS 协议

这个 HTTPS 协议就是对上面数字签名和数字证书的实例应用

1、

首先,客户端向服务器发出加密请求。

2、

服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。

3、

注:输入 certmgr.msc 可以查看本地安装的证书

客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

4、

如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

5、

如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

6、

如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

SSL/TLS

1、客户端请求建立 SSL 链接,并向服务端发送协议版本号、一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。

2、服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥。

3、客户端收到服务端的回复后,确认数字证书有效,然后生成新的随机数–Pre-master secret,通过服务端下发的公钥及加密方法进行加密,发送给服务器。

4、服务端收到客户端的回复,利用自己的私钥解密获得Pre-master secret,

5、服务端利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key(包含于上面提到的master secret中),用来加密接下来的整个对话过程。

具体细节参考 SSL 的笔记

References